package vaccine.appointment.system.appointmentrecord.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vaccine.appointment.system.appointmentrecord.mq.OverdueReminderMessage;
import vaccine.appointment.system.appointmentrecord.vo.AppointmentCalendarDayVO;
import vaccine.appointment.system.appointmentrecord.vo.AppointmentRecordVO;
import vaccine.appointment.system.appointmentrecord.vo.CreateAppointmentRequest;
import vaccine.appointment.system.appointmentrecord.vo.TodayAppointmentVO;

import java.time.LocalDate;
import java.util.List;

/**
 * 预约记录服务接口
 */
public interface AppointmentRecordService {

    void sendMessage(OverdueReminderMessage message);

    /**
     * 创建预约
     * @param userId 用户ID
     * @param request 创建预约请求
     * @return 是否成功
     */
    Boolean createAppointment(Integer userId, CreateAppointmentRequest request);

    /**
     * 查询预约记录列表
     * @param userId 用户ID
     * @param status 预约状态（可选）
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页数据
     */
    Page<AppointmentRecordVO> getAppointmentList(Integer userId, Integer status, Integer pageNum, Integer pageSize);

    /**
     * 取消预约
     * @param userId 用户ID
     * @param appointmentId 预约ID
     * @return 是否成功
     */
    Boolean cancelAppointment(Integer userId, Integer appointmentId);

    /**
     * 查询逾期未接种的预约记录
     * @param userId 用户ID
     * @return 逾期预约列表
     */
    List<AppointmentRecordVO> getOverdueAppointments(Integer userId);

    /**
     * 查询当日预约列表（管理员功能）
     * @param vaccinationSiteId 接种点ID
     * @param status 预约状态（可选）
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页数据
     */
    Page<TodayAppointmentVO> getTodayAppointments(Integer vaccinationSiteId, Integer status, Integer pageNum, Integer pageSize);

    /**
     * 获取指定日期的预约列表（管理员功能）
     */
    List<TodayAppointmentVO> getAppointmentsByDate(Integer vaccinationSiteId, LocalDate date);

    /**
     * 获取指定月份的预约汇总
     */
    List<AppointmentCalendarDayVO> getMonthlySummary(Integer vaccinationSiteId, LocalDate month);

    /**
     * 更新预约状态（管理员功能）
     * @param appointmentId 预约ID
     * @param status 新状态
     * @param vaccinationSiteId 接种点ID（用于权限验证）
     * @return 是否成功
     */
    Boolean updateAppointmentStatus(Integer appointmentId, Integer status, Integer vaccinationSiteId);
}
